#include <cmath>
#include <iostream>
#include <stdlib.h>
#include <string>
#include <unordered_set>
using namespace std;
class Solution {
  public:
    int lengthOfLongestSubstring(string s) {
        unordered_set<char> set;
        int left = 0, right = -1, size = 0, length = s.size();

        while (left < length) {
            for (right = left + set.size(); right < length; right++) {
                if (!set.count(s[right])) {
                    set.insert(s[right]);
                } else {
                    break;
                }
            }
            size = max(right - left, size);
            if(right == length){
                break;
            }
            while (set.count(s[right])) {
                set.erase(s[left++]);
            }
        }
        return size;
    }
};
// class Solution {
//   public:
//     int lengthOfLongestSubstring(string s) {
//         if (s.length() < 1) {
//             return 0;
//         }
//         int start = 0;
//         int end = 1;
//         int size = 1;
//         string subs = "";
//         char c = s.at(start);
//         while (end < s.length()) {
//             // c = s.at(end);
//             int repeat;
//             do {
//                 subs = subs + c;
//                 if (size < end - start) {
//                     size = end - start;
//                 }
//                 if (end < s.length()) {
//                     c = s.at(end++);
//                     repeat = subs.find(c);
//                 } else {
//                     break;
//                 }

//             } while (repeat == subs.npos);
//             if (end >= s.length()) {
//                 break;
//             }
//             start += repeat + 1;
//             subs = subs.substr(repeat+1);
//         }

//         return size;
//     }
// };
int main(int argc, char const *argv[]) {
    string s = "eeydgwdykpv";
    Solution solution = Solution();
    cout << solution.lengthOfLongestSubstring(s) << endl;
    return 0;
}
